package com.yuw.producerandconsumer;

public class MyStack {
    // 属性
    private Object[] stack;
    // 栈的元素个数
    private int len;
    // 栈顶元素指针位置
    private int index;

    public MyStack(int len) {
        this.len = len;
        // 初始化栈的数组
        stack = new Object[len];
        // 栈顶元素初始位置
        this.index = 0;
    }

    // 行为

    /**
     * 入栈操作
     *
     * @param obj 被入栈的元素
     */
    public synchronized void push(Object obj) {
        // 仓库满了
        if (index >= len) {
            try {
                // 生产者发现仓库满了，则主动进入等待队列，等待消费者消费
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 入栈操作
        // 存入元素
        stack[index] = obj;
        // 栈顶指针向上移动一个位置
        index++;
        // 生产者生产产品之后，要通知消费者的等待队列，可以去消费了

        this.notifyAll();
    }

    /**
     * 出栈操作
     *
     * @return 出栈的元素
     */
    public synchronized Object pop() {
        // 仓库为空

        if (index <= 0) {
            try {
                // 如果消费者发现仓库空了，则主动进入等待状态
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 栈顶指针向下移动一个位置
        index--;
        // 取出栈顶元素
        Object obj = stack[index];
        // 清空栈顶位置
        stack[index] = null;

        // 消费之后，通知生产者去进行生产
        this.notifyAll();

        return obj;
    }

}
